home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMICUS25.ADF / Guru / guru.c < prev    next >
C/C++ Source or Header  |  1989-01-26  |  9KB  |  229 lines

  1. #include <exec/alerts.h>
  2. #include <libraries/dos.h>
  3. #include <stdio.h>
  4.  
  5. #define AO_DiskCopy (AN_DiskCopy >> 24 | 0x00008000)
  6.  
  7. main(argc,argv)
  8. int argc;
  9. char **argv;
  10. {
  11.    /***** Functions and local variables *****/
  12.  
  13.    long exp();
  14.    int stch_i();     /* Converts hex string to integer */
  15.    void fputs();
  16.  
  17.    unsigned long error;    /* User-specified argument */
  18.    char *o;                /* Object of alert, i.e. troublesome subsystem */
  19.    char *s;                /* Specific cause of crash */
  20.  
  21.    /***** Here we go *****/
  22.  
  23.    if (argc == 0)             /* Don't let Workbench call us */
  24.       exit (RETURN_ERROR);
  25.  
  26.    if (argc == 1) {
  27.       fputs ("How can I meditate without a number?\n",stderr);
  28.       exit (RETURN_ERROR);
  29.       }
  30.  
  31.    if (stch_i(argv[1],&error) == 0) {   /* Put argument into integer */
  32.       fputs ("Usage: ",stdout);
  33.       fputs (argv[0],stdout);
  34.       fputs (" <hex integer>\n",stdout);
  35.       exit (RETURN_WARN);
  36.       }
  37.  
  38.    /***** Alert object *****/
  39.  
  40.    switch ((error & 0x7F000000) >> 24 | 0x00008000) {
  41.  
  42.       case AO_ExecLib      : o = "Exec"; break;
  43.       case AO_GraphicsLib  : o = "Graphics"; break;
  44.       case AO_LayersLib    : o = "Layers library"; break;
  45.       case AO_Intuition    : o = "Intuition"; break;
  46.       case AO_MathLib      : o = "Math library"; break;
  47.       case AO_CListLib     : o = "CList library"; break;
  48.       case AO_DOSLib       : o = "DOS"; break;
  49.       case AO_RAMLib       : o = "RAM library"; break;
  50.       case AO_IconLib      : o = "Icon library"; break;
  51.       case AO_ExpansionLib : o = "Expansion library"; break;
  52.       case AO_AudioDev     : o = "Audio device"; break;
  53.       case AO_ConsoleDev   : o = "Console device"; break;
  54.       case AO_GamePortDev  : o = "Gameport device"; break;
  55.       case AO_KeyboardDev  : o = "Keyboard device"; break;
  56.       case AO_TrackDiskDev : o = "Trackdisk device"; break;
  57.       case AO_TimerDev     : o = "Timer device"; break;
  58.       case AO_CIARsrc      : o = "CIA resource"; break;
  59.       case AO_DiskRsrc     : o = "Disk resource"; break;
  60.       case AO_MiscRsrc     : o = "Misc resource"; break;
  61.       case AO_BootStrap    : o = "Bootstrap"; break;
  62.       case AO_Workbench    : o = "Workbench"; break;
  63.       case AO_DiskCopy     : o = "DiskCopy"; break;
  64.       default              : o = "Unknown subsystem"; break;
  65.       }  /* object */
  66.  
  67.    /***** Specific error *****/
  68.  
  69.    switch (error) {
  70.  
  71.       /* Exec woes */
  72.  
  73.       case AN_ExcptVect  : s = "bad 68000 exception vector checksum"; break;
  74.       case AN_BaseChkSum : s = "bad ExecBase checksum"; break;
  75.       case AN_LibChkSum  : s = "library checksum failure"; break;
  76.       case AN_LibMem     : s = "insufficient memory to make library"; break;
  77.       case AN_MemCorrupt : s = "corrupted memory list"; break;
  78.       case AN_IntrMem    : s = "insufficient memory for interrupt servers";
  79.                            break;
  80.       case AN_InitAPtr   : s = "InitStruct() of an APTR source"; break;
  81.       case AN_SemCorrupt : s = "illegal semaphore state"; break;
  82.       case AN_FreeTwice  : s = "tried to free memory already freed"; break;
  83.       case AN_BogusExcpt : s = "illegal 680x0 exception taken"; break;
  84.  
  85.       /* Graphics library */
  86.  
  87.       case AN_GfxNoMem     : s = "insufficient memory for graphics"; break;
  88.       case AN_LongFrame    : s = "insufficient memory for long frame"; break;
  89.       case AN_ShortFrame   : s = "insufficient memory for short frame"; break;
  90.       case AN_TextTmpRas   : s = "insufficient memory for text TmpRas"; break;
  91.       case AN_BltBitMap    : s = "insufficient memory for BltBitMap"; break;
  92.       case AN_RegionMemory : s = "insufficient memory for regions"; break;
  93.       case AN_MakeVPort    : s = "insufficient memory for MakeVPort"; break;
  94.       case AN_GfxNoLCM     : s = "emergency memory not available"; break;
  95.  
  96.       /* Layers library */
  97.  
  98.       case AN_LayersNoMem  : s = "insufficient memory for layers"; break;
  99.  
  100.       /* Intuition */
  101.  
  102.       case AN_GadgetType   :
  103.       case AN_BadGadget    : s = "unknown gadget type"; break;
  104.       case AN_CreatePort   : s = "insufficient memory to create port"; break;
  105.       case AN_ItemAlloc    : s = "insufficient memory for item plane"; break;
  106.       case AN_SubAlloc     : s = "insufficient memory for sub alloc"; break;
  107.       case AN_PlaneAlloc   : s = "insufficient memory for plane alloc"; break;
  108.       case AN_ItemBoxTop   : s = "item box top is less than RelZero"; break;
  109.       case AN_OpenScreen   : s = "insufficient memory to open screen"; break;
  110.       case AN_OpenScrnRast : s = "insufficient memory to allocate screen raster";
  111.                              break;
  112.       case AN_SysScrnType  : s = "unknown type of sys screen"; break;
  113.       case AN_AddSWGadget  : s = "insufficient memory to add SW gadgets";
  114.                              break;
  115.       case AN_OpenWindow   : s = "insufficient memory to open window"; break;
  116.       case AN_BadState     : s = "bad state return entering Intuition"; break;
  117.       case AN_BadMessage   : s = "bad message received by IDCMP"; break;
  118.       case AN_WeirdEcho    : s = "weird echo caused incomprehension"; break;
  119.       case AN_NoConsole    : s = "couldn't open the console device"; break;
  120.  
  121.       /* DOS library */
  122.  
  123.       case AN_StartMem     : s = "insufficient memory at startup"; break;
  124.       case AN_EndTask      : s = "EndTask didn't"; break;
  125.       case AN_QPktFail     : s = "Qpkt failed"; break;
  126.       case AN_AsyncPkt     : s = "unexpected packet received"; break;
  127.       case AN_FreeVec      : s = "FreeVec failed"; break;
  128.       case AN_DiskBlkSeq   : s = "disk block sequence error"; break;
  129.       case AN_BitMap       : s = "BitMap corrupt"; break;
  130.       case AN_KeyFree      : s = "key already free"; break;
  131.       case AN_BadChkSum    : s = "invalid checksum"; break;
  132.       case AN_DiskError    : s = "disk error"; break;
  133.       case AN_KeyRange     : s = "key out of range"; break;
  134.       case AN_BadOverlay   : s = "bad overlay"; break;
  135.  
  136.       /* RAM library */
  137.  
  138.       case AN_BadSegList   : s = "no overlays in library SegLists"; break;
  139.  
  140.       /* Expansion library */
  141.  
  142.       case 0x0A000001      : s = "Bad Expansion Free"; break;
  143.  
  144.       /* Trackdisk device */
  145.  
  146.       case AN_TDCalibSeek  : s = "seek error on calibration"; break;
  147.       case AN_TDDelay      : s = "error on timer wait"; break;
  148.  
  149.       /* Timer device */
  150.  
  151.       case AN_TMBadReq     : s = "bad timer request"; break;
  152.       case AN_TMBadSupply  : s = "power supply doesn't supply ticks"; break;
  153.  
  154.       /* Disk resource */
  155.  
  156.       case AN_DRHasDisk    : s = "tried to get unit, but already had disk";
  157.                              break;
  158.       case AN_DRIntNoAct   : s = "no active unit to interrupt"; break;
  159.  
  160.       /* Bootstrap */
  161.  
  162.       case AN_BootError    : s = "boot code returned an error"; break;
  163.  
  164.       /* CPU Traps */
  165.  
  166.       case 0x00000002      : o = "CPU Trap"; s = "Bus error"; break;
  167.       case 0x00000003      : o = "CPU Trap"; s = "Address error"; break;
  168.       case 0x00000004      : o = "CPU Trap"; s = "Illegal instruction"; break;
  169.       case 0x00000005      : o = "CPU Trap"; s = "Divide-by-Zero"; break;
  170.       case 0x00000006      : o = "CPU Trap"; s = "CHK instruction"; break;
  171.       case 0x00000007      : o = "CPU Trap"; s = "TRAPV instruction"; break;
  172.       case 0x00000008      : o = "CPU Trap"; s = "Privilege violation"; break;
  173.       case 0x00000009      : o = "CPU Trap"; s = "Trace"; break;
  174.       case 0x0000000A      : o = "CPU Trap"; s = "Op Code 1010"; break;
  175.       case 0x0000000B      : o = "CPU Trap"; s = "Op Code 1111"; break;
  176.  
  177.       /* Don't know specific difficulty, try to determine general problem */
  178.  
  179.       default : switch (error & 0x00FF0000) {
  180.  
  181.                    case AG_NoMemory : s = "no memory"; break;
  182.                    case AG_MakeLib  : s = "MakeLib"; break;
  183.                    case AG_OpenLib  : s = "OpenLib"; break;
  184.                    case AG_OpenDev  : s = "OpenDev"; break;
  185.                    case AG_OpenRes  : s = "OpenRes"; break;
  186.                    case AG_IOError  : s = "IO error"; break;
  187.                    case AG_NoSignal : s = "no signal"; break;
  188.                    default          : s = "unknown error"; break;
  189.  
  190.                    }  /* general */
  191.  
  192.          }  /* specific */
  193.  
  194.    /***** Print it out *****/
  195.  
  196.    fputs (o,stdout);
  197.    fputs (": ",stdout);
  198.    fputs (s,stdout);
  199.    fputs (".\n",stdout);
  200. }
  201.  
  202. stch_i(st,lg)
  203. char    *st;
  204. unsigned long *lg;
  205. {
  206. char    ch;
  207. short    i,digit;
  208. unsigned long total;
  209.     total = 0;
  210.     for(i=0;i<strlen(st);i++){
  211.         ch = *(st+i);
  212.         if((ch >= 'A') && (ch <= 'F'))
  213.             digit = (short)ch - 55;
  214.         else{
  215.             if((ch >= 'a') && (ch <= 'f'))
  216.                 digit = (short)ch - 87;
  217.             else{
  218.                 if((ch >= '0') && (ch <= '9'))
  219.                     digit = (short)ch - 48;
  220.                 else
  221.                     return(0);
  222.             }
  223.         }
  224.         total = 16 * total + digit;
  225.     }
  226.     *lg = total;
  227.     return(1);
  228. }
  229.